package net.xxcxcxcx.xc_enhancedmob.config;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.*;
import java.util.function.Consumer;

import static net.xxcxcxcx.xc_enhancedmob.EnhancedMobMod.ModId;

/**
 * 实现一个Config的读写功能
 * <p>使用GSON来实现
 * <p>当配置文件与上一次的文件信息不同时候会重新生成缺失部分
 */
public class ConfigLoader<T extends CustomConfig> {
    private static final Gson GSON = new GsonBuilder()
            .setLenient()
            //         .serializeNulls()//输出和保存null值
            .setPrettyPrinting()//格式化输出
            .excludeFieldsWithoutExposeAnnotation()//条件序列化需要@Expose注解
            .create();
    private final File configFile;
    private final Consumer<T> onLoad;//函数式编程
    private final T defaultConfig;

    /**
     * 构造config，如果对应config文件不存在则创建，并为其赋初始值，
     * <p>若有则检测config版本，新版本config会导致旧版本config重新生成。
     * <p>创建文件后读取初始值，并用json方式解析
     */
    public ConfigLoader(T defaultConfig, Consumer<T> onLoad) throws IOException {
        this.onLoad = onLoad;
        configFile = new File(String.format("./config/" + ModId + "/%s%s.json", defaultConfig.getFilename(), defaultConfig.getName()));
        this.defaultConfig = defaultConfig;
        //加载config
        LoadConfig();
    }

    public T LoadConfig() {
        T config = null;
        if (configFile.exists()) {
            try {
                FileReader reader = new FileReader(configFile);
                config = (T) GSON.fromJson(reader, defaultConfig.getClass());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        if (config == null) {
            this.onLoad.accept(defaultConfig);
            SaveConfig(defaultConfig);
        } else {
            this.onLoad.accept(config);
            config.RepairData();
            SaveConfig(config);
        }
        return config;
    }

    public void SaveConfig(T config) {
        if (!configFile.exists()) {
            configFile.getParentFile().mkdirs();//先得到文件的上级目录，并创建上级目录，在创建文件
            try {
                configFile.createNewFile();//创建文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileWriter writer;
        try {
            writer = new FileWriter(configFile);
            String configJsonString = GSON.toJson(config);
            writer.write(configJsonString);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
